home *** CD-ROM | disk | FTP | other *** search
-
- {
- KB> How do get the disk size or the total clusters on a CD-ROM?
- }
-
- program CD_Info;
-
- uses crt, dos;
-
- Type tReq_Blk = Array[0..255] of Byte;
- tReq_Hdr = Array[0..017] of Word;
-
- Const MSCDEX_GETDRIVES = $1500;
- MSCDEX_GETVERSION = $150C;
- MSCDEX_DRIVER_REQ = $1510;
-
- MSCDEX_GetSecSize = 7;
- MSCDEX_GetVolSize = 8;
-
- RAW_DATA = 1;
-
- Var CPU : Registers;
- Akt, Cnt, First : byte;
- Req_Hdr : tReq_Hdr;
- Req_Blk : tReq_Blk;
- SecSize : word;
- VolBytes : real;
- VolSize : LongInt;
-
- function CallDriver( Var R: Registers ):byte;
- begin
- Intr($2F, R);
- if (R.FLAGS and FCARRY) <> 0
- then CallDriver := R.AL
- else CallDriver := 0;
- end;
-
-
-
- begin
- writeln; writeln;
- writeln(' CD-ROM Info v1.0 (c) Norbert Igl 1994 ');
- writeln;
- With CPU do
- begin
- FillChar( CPU, Sizeof( CPU ), 0);
- AX := MSCDEX_GETVERSION;
- If CallDriver( CPU ) <> 0 then
- begin
- writeln(' MSCDEX not installed ... ');
- halt(1);
- end
- else begin
- writeln(' MSCDEX Version : ',Hi(BX),'.',Lo(BX):2 );
- end;
-
- FillChar( CPU, Sizeof( CPU ), 0);
- AX := MSCDEX_GETDRIVES;
- If CallDriver( CPU ) <> 0 then
- begin
- writeln(' GETDRIVES Error : ',Lo(AX) );
- halt(2);
- end
- else begin
- Cnt := BX;
- First := CX;
- write(' Installed Drives : ',Cnt,' ( ');
- write( CHAR( 65+first ),':');
- if Cnt > 1 then
- write(' .. ', CHAR( 64+first+cnt),':');
- writeln(' )');
- end;
- For Akt := First to First+Cnt-1 do
- begin
- FillChar( CPU, Sizeof( CPU ), 0);
- FillChar( Req_Blk, Sizeof( Req_Blk ), 0);
- FillChar( Req_Hdr, Sizeof( Req_Hdr ), 0);
-
- Req_Hdr[0] := $000D; { length of req_hdr }
- Req_Hdr[1] := $0003; { IOCTL_READ }
- Req_Hdr[7] := Ofs(Req_Blk);
- Req_Hdr[8] := Seg(Req_Blk);
- Req_Hdr[9] := $0004;
-
- Req_Blk[0] := MSCDEX_GetSecSize;
-
- AX := MSCDEX_DRIVER_REQ;
- CX := Akt;
- ES := SEG( Req_Hdr );
- BX := OFS( Req_Hdr );
- If CallDriver( CPU ) <> 0 then
- begin
- writeln(' GetSecSize Drive(',Char(Akt+65),') Error : ',Lo(AX) );
- end
- else Move(Req_Blk[2], SecSize, 2);
-
- FillChar( CPU, Sizeof( CPU ), 0);
- FillChar( Req_Blk, Sizeof( Req_Blk ), 0);
- FillChar( Req_Hdr, Sizeof( Req_Hdr ), 0);
-
- Req_Hdr[0] := $000D; { length of req_hdr }
- Req_Hdr[1] := $0003; { IOCTL_READ }
- Req_Hdr[7] := Ofs(Req_Blk);
- Req_Hdr[8] := Seg(Req_Blk);
- Req_Hdr[9] := $0005;
-
- Req_Blk[0] := MSCDEX_GetVolSize;;
-
- AX := MSCDEX_DRIVER_REQ;
- CX := Akt;
- ES := SEG( Req_Hdr );
- BX := OFS( Req_Hdr );
- If CallDriver( CPU ) <> 0 then
- begin
- writeln(' GetVolSize Drive(',Char(Akt+65),') Error : ',Lo(AX) );
- end
- else Move(Req_Blk[1], VolSize, 4);
-
- VolBytes := VolSize;
- if VolBytes < 0 then
- begin
- VolSize := ( VolSize shr 1 );
- VolBytes := Volsize;
- VolBytes := VolBytes*2;
- end;
- VolBytes := Volbytes * SecSize;
- VolBytes := Volbytes / ( 1024*1024 );
- Writeln(' Disk in Drive ',Char(Akt+65),' : ',VolBytes:6:2 ,' MB ');
- end;
- end
- end.